/*
thought:可添加一棵树作为未满m颗种子时其余种子的存放位置，即将问题演化为将m棵种子
        放于n+1棵树上。
*/


#include <iostream>
#include <cstdio>

using namespace std;

long long num[100001];
long long quickPow(long long a,long long b,long long p) ;
long long locas(long long m,long long n,long long p);
void init(long long p);

int main(void) {
  int T;
  cin >> T;

  long long  m,n,p;
  for (int i = 0; i < T; i++)
 {
    scanf("%lld %lld %lld",&n,&m,&p );
    init(p);
    std::cout << locas(m,n+m,p) << endl;

  }

  return 0;
}


void init(long long p)  //观察locas定理的函数可知，ni、mi由n、m对p取余得到，故程序中的用到的阶乘不会大于p！
{
  num[0] = 1;
  for (long long i = 1; i <= p; i++) {
    num[i] = num[i-1] * i % p;
  }

}



long long locas(long long m,long long n,long long p)
{

  // if(m > n) return 0;
  // if(m==0) return 1;
  long long mi,ni;
  long  long mup = 1;
  long long temp = 1 ;
  while(m!=0 && n!=0)
  {
    mi = m%p;
    ni = n%p;
    if(mi > ni) return 0;
    // if(mi == 0)
    // {
    //   mup = mup * 1;
    //   continue;
    // }

      temp = num[mi] * num[ni - mi] % p;

    mup = mup * num[ni] * quickPow(temp,p-2,p) % p;  //费马小定理，将c(m,n)中的除号转化为乘号，这样可分别取余防止溢出

    m = m/p;
    n = n/p;

  }

  return mup;
}

long long quickPow(long long a,long long b,long long p)  //快速幂,将a的b次方中的b化为二进制表示，快速求解
{
  long long temp,res;
  temp = a;  //temp = a的2的0次方
  res = 1;
  while(b)
  {
    if(b&1) res = res * temp % p;  //当b=b1b2b3b4...bn中的bi为1时，求幂才需要计入
    temp = temp * temp % p; // temp = a的x+2次方，x为上次的次方，如第一次时，此处变为a的2的1次方。
    b >>= 1; //b右移
  }
  return res;
}
